bitkeeper revision 1.187 (3ead25859Pbawg2pQ_-rP3ATdde0_Q)
authorach61@labyrinth.cl.cam.ac.uk <ach61@labyrinth.cl.cam.ac.uk>
Mon, 28 Apr 2003 12:58:45 +0000 (12:58 +0000)
committerach61@labyrinth.cl.cam.ac.uk <ach61@labyrinth.cl.cam.ac.uk>
Mon, 28 Apr 2003 12:58:45 +0000 (12:58 +0000)
additional debugging

xen/drivers/block/xen_block.c
xen/drivers/block/xen_segment.c
xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/block/xl_block.c
xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/block/xl_block.h

index 868838d85d3f8a5f8076812127102ef2174c7ccf..aedbe3abcd140972a464bd6ee2f0c21beabeb85e 100644 (file)
@@ -210,11 +210,6 @@ static void end_block_io_op(struct buffer_head *bh, int uptodate)
         pending_req->status = 2;
     }
 
-    if (pending_req->status)
-    {
-      printk ("Hey! status is %d\n", pending_req->status);
-    }
-
     unlock_buffer(pending_req->domain, 
                   virt_to_phys(bh->b_data), 
                   bh->b_size, 
@@ -568,7 +563,10 @@ static void dispatch_rw_block_io(struct task_struct *p, int index)
         }
 
         if ( !__buffer_is_valid(p, buffer, nr_sects<<9, (operation==READ)) )
+       {
+            DPRINTK("invalid buffer\n");
             goto bad_descriptor;
+       }
 
         /* Get the physical device and block index. */
         if ( (req->device & XENDEV_TYPE_MASK) == XENDEV_VIRTUAL )
@@ -578,7 +576,11 @@ static void dispatch_rw_block_io(struct task_struct *p, int index)
                 req->device, 
                 req->sector_number + tot_sects,
                 buffer, nr_sects);
-            if ( new_segs <= 0 ) goto bad_descriptor;
+            if ( new_segs <= 0 ) 
+           {
+               DPRINTK("bogus xen_segment_map_request\n");
+               goto bad_descriptor;
+           }
         }
         else
         {
@@ -586,7 +588,11 @@ static void dispatch_rw_block_io(struct task_struct *p, int index)
             phys_seg[nr_psegs].sector_number = req->sector_number + tot_sects;
             phys_seg[nr_psegs].buffer        = buffer;
             phys_seg[nr_psegs].nr_sects      = nr_sects;
-            if ( phys_seg[nr_psegs].dev == 0 ) goto bad_descriptor;
+            if ( phys_seg[nr_psegs].dev == 0 ) 
+           {
+               DPRINTK("bad device\n");
+               goto bad_descriptor;
+           }
             new_segs = 1;
         }
         
@@ -690,11 +696,6 @@ static void make_response(struct task_struct *p, unsigned long id,
     int position;
     blk_ring_t *blk_ring;
 
-    if (st != 0)
-    {
-      printk("status is %ld\n", st);
-    }
-
     /* Place on the response ring for the relevant domain. */ 
     spin_lock_irqsave(&p->blk_ring_lock, flags);
     blk_ring = p->blk_ring_base;
index 5d26fcc113a2738e74f90b068e8d14bfbb159831..db292ac4b47c603d0a95be3c3eacfcabb1ea17b6 100644 (file)
 
 segment_t xsegments[XEN_MAX_SEGMENTS];
 
+#if 0
+#define DPRINTK(_f, _a...) printk( _f , ## _a )
+#else
+#define DPRINTK(_f, _a...) ((void)0)
+#endif
+
 /*
  * xen_segment_map_request
  *
@@ -37,18 +43,36 @@ int xen_segment_map_request(
     int sum, i;
 
     segment_number &= XENDEV_IDX_MASK;
-    if ( segment_number >= XEN_MAX_SEGMENTS ) goto fail;
+    if ( segment_number >= XEN_MAX_SEGMENTS )
+    {
+      DPRINTK("invalid segment number. %d %d\n",
+             segment_number, XEN_MAX_SEGMENTS);
+      goto fail;
+    }
 
     seg = p->segment_list[segment_number];
-    if ( seg == NULL ) goto fail;
+    if ( seg == NULL ) 
+    {
+      DPRINTK("segment is null. %d\n", segment_number);
+      goto fail;
+    }
 
     /* check domain permissions */
-    if ( seg->domain != p->domain ) goto fail;
+    if ( seg->domain != p->domain )
+    {
+      DPRINTK("segment is for another domain. %d %d\n",
+             seg->domain, p->domain);
+      goto fail;
+    }
 
     /* check rw access */
     if ((operation == WRITE && seg->mode != XEN_SEGMENT_RW) ||
         (operation == READ  && seg->mode == XEN_SEGMENT_UNUSED))
+    {
+        DPRINTK("illegal operation: %d %d\n",
+               operation, seg->mode);
         goto fail;
+    }
 
     /* find extent, check size */
     sum = 0; 
@@ -60,36 +84,88 @@ int xen_segment_map_request(
         ext++; i++;
     }
 
-    if ( (sum + ext->size) <= sect_nr ) goto fail;
+    if ( (sum + ext->size) <= sect_nr ) 
+    {
+      DPRINTK("extent size mismatch: %d %d : %d %ld %ld\n",
+             i, seg->num_extents, sum, ext->size, sect_nr);
+      goto fail;
+    }
 
-    pseg->sector_number = sect_nr + ext->offset - sum;
+    pseg->sector_number = (sect_nr - sum) + ext->offset;
     pseg->buffer        = buffer;
     pseg->nr_sects      = nr_sects;
     pseg->dev           = xendev_to_physdev(ext->disk);
-    if ( pseg->dev == 0 ) goto fail;
+    if ( pseg->dev == 0 ) 
+    {
+        DPRINTK ("invalid device 0x%x 0x%lx 0x%lx\n", 
+                ext->disk, ext->offset, ext->size);
+       goto fail;
+    }
 
     /* We're finished if the virtual extent didn't overrun the phys extent. */
     if ( (sum + ext->size) >= (sect_nr + nr_sects) )
-        return 1; /* Just one more physical extent. */
+        return 1;                         /* entire read fits in this extent */
 
     /* Hmmm... make sure there's another extent to overrun onto! */
-    if ( (i+1) == seg->num_extents ) goto fail;
+    if ( (i+1) == seg->num_extents ) 
+    {
+        DPRINTK ("not enough extents %d %d\n",
+                i, seg->num_extents);
+       goto fail;
+    }
 
     pseg[1].nr_sects = (sect_nr + nr_sects) - (sum + ext->size);
     pseg[0].nr_sects = sum + ext->size - sect_nr;
     pseg[1].buffer = buffer + (pseg->nr_sects << 9);
     pseg[1].sector_number = ext[1].offset;
     pseg[1].dev = xendev_to_physdev(ext[1].disk);
-    if ( pseg[1].dev == 0 ) goto fail;
+    if ( pseg[1].dev == 0 ) 
+    {
+        DPRINTK ("bogus device for pseg[1] \n");
+       goto fail;
+    }
 
     /* We don't allow overrun onto a third physical extent. */
     if ( (sum + ext[0].size + ext[1].size) < 
          (pseg[1].sector_number + pseg[1].nr_sects) )
+    {
+        DPRINTK ("third extent\n");
+        DPRINTK (" sum:%d, e0:%ld, e1:%ld   p1.sect:%ld p1.nr:%d\n",
+                sum, ext[0].size, ext[1].size, 
+                pseg[1].sector_number, pseg[1].nr_sects);
         goto fail;    
+    }
 
-    return 2; /* We overran onto a second physical es\xtent. */
+    return 2;                   /* We overran onto a second physical extent. */
 
  fail:
+
+    DPRINTK ("xen_segment_map_request failure\n");
+    DPRINTK ("operation: %d\n", operation);
+    DPRINTK ("segment number: %d\n", segment_number);
+    DPRINTK ("sect_nr: %ld 0x%lx\n", sect_nr, sect_nr);
+    DPRINTK ("nr_sects: %d 0x%x\n", nr_sects, nr_sects);
+
+    if (0)
+    {
+      segment_t *xseg;
+      extent_t  *xext;
+      int xsum, xi;
+
+      xseg = p->segment_list[segment_number];
+
+      xsum = 0; xi = 0;
+      xext = xseg->extents;
+
+      while ( (xi < xseg->num_extents) && ((xsum + xext->size) <= sect_nr) )
+      {
+       DPRINTK (" xi:%d, num_ext:%d, xsum:%d, size:%lx, sect_nr:%lx\n",
+                xi, xseg->num_extents, xsum, xext->size, sect_nr);
+       xsum += xext->size;
+        xext++; xi++;
+      }
+    }
+
     return -1;
 }
 
index 9de2f0bf96092c766788624aa4d2b921ff4ed341..6e66845c8404a6dbb1218f8bd01206be4375a590 100644 (file)
@@ -120,6 +120,11 @@ int xenolinux_block_release(struct inode *inode, struct file *filep)
     return 0;
 }
 
+/*
+ * handle ioctl calls
+ *
+ * individual ioctls are defined in /usr/include/linux/fs.h
+ */
 
 int xenolinux_block_ioctl(struct inode *inode, struct file *filep,
                          unsigned command, unsigned long argument)
@@ -299,6 +304,7 @@ static int hypervisor_request(unsigned long   id,
     case XEN_BLOCK_WRITE:
         phys_device = xldev_to_physdev(device);
        gd = xldev_to_gendisk(device); 
+
        sector_number += gd->part[MINOR(device)].start_sect;
         if ( (sg_operation == operation) &&
              (sg_dev == phys_device) &&
index 3d219eeedcd46b951c7beb76388fb6a8d26e1ba4..bc6432b778bbf62173b3164804c5cf8e5f694b63 100644 (file)
 
 #if 0
 #define DPRINTK(_f, _a...) printk ( KERN_ALERT _f , ## _a )
-#define DPRINTK_IOCTL(_f, _a...) printk ( KERN_ALERT _f , ## _a )
 #else
 #define DPRINTK(_f, _a...) ((void)0)
+#endif
+
+#if 0
+#define DPRINTK_IOCTL(_f, _a...) printk ( KERN_ALERT _f , ## _a )
+#else
 #define DPRINTK_IOCTL(_f, _a...) ((void)0)
 #endif